跳到主要内容

04 DAC实验

up的视频讲解

先设置一个固定模拟电压,再按时间更新数据,形成随时间变化的波形。

up视频里的实验代码: 👣DAC实验代码

DAC驱动文件: DAC驱动代码

1 📢 蜂鸣器-DAC电压输出实验​

1.1 实验连接​

按图连接外置 DAC、蜂鸣器与主控。课程驱动通过 I2C2 与模块通信。

按图连接外置 DAC、蜂鸣器与主控。课程驱动通过 I2C2 与模块通信。
按图连接外置 DAC、蜂鸣器与主控。课程驱动通过 I2C2 与模块通信。
注意
课程配图

如果盒子里面有这个小卡片的话 代表着up把SCL和SDA的丝印画反了 大家可以按照小卡片上的来

1.2 实验原理​

本课使用外置 DAC,主控通过 IIC 发送数字值,由模块把它转换成模拟电压。先输出固定值,可以把“发送的数字”和“实际输出电压”对应起来。

下面代码以参考电压和 12 位分辨率换算目标值。观察蜂鸣器驱动的响应,再联系前面三极管控制负载的电路。

1.3 CubeMX配置​

选择 I2C2 的 I2C 模式,选择 Fast Mode。驱动使用 hi2c2,引脚为 PB10(SCL)和 PB11(SDA)。将“禁用时钟拉伸”设为启用。

DAC实验I2C2配置
DAC实验通信参数

解压本页 DAC 驱动并放入工程文件夹,在 MDK 的 Include Paths 中添加驱动目录,再把源文件加入用户分组。随后包含 dac.h,便可以使用驱动提供的 DAC_SetDigital()。

1.4 实验代码​

全局​

#include "dac.h"

main()​

DAC_SetDigital(0.7/3.3*4096);

while(1)​

2 〰️ DAC波形发生实验​

2.1 实验连接​

将模拟输出与扬声器相关电路按图连接,延续外置 DAC 的通信接线。

将模拟输出与扬声器相关电路按图连接,延续外置 DAC 的通信接线。
将模拟输出与扬声器相关电路按图连接,延续外置 DAC 的通信接线。
注意
课程配图

如果盒子里面有这个小卡片的话 代表着up把SCL和SDA的丝印画反了 大家可以按照小卡片上的来

2.2 实验原理​

固定数字值对应固定输出,周期性改变数字值就形成波形。本课使用正弦函数计算每一个输出点,再通过 DAC 更新电压。

正弦函数使用弧度,因此先把角度相位转换为弧度:完整一周的 360° 对应 2π。程序再把正弦值从 −1~1 映射到 DAC 的数字范围。

定时器提供更新节奏,主循环根据标志生成下一点。读代码时分别找到定时通知、相位推进和 DAC 写入这三个动作。

如果每次相位推进 3.6°,完整一周需要 100 次更新。在每秒约 1000 次更新的演示中,输出波形约为 10 Hz。改变相位步长或定时器更新频率,都能改变波形频率。

2.3 CubeMX配置​

I2C2保持上一实验配置。TIM2选择Internal Clock并开启更新中断;假设TIM2时钟72 MHz,可先设PSC=71、ARR=999,得到1000次/秒更新。

CubeMX配置
CubeMX配置
CubeMX配置

2.4 实验代码​

全局​

#include "dac.h"
#include "math.h"

#define PI 3.1415926535

uint8_t flag = 0;

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
flag = 1;
}
}

main()​

HAL_TIM_Base_Start_IT(&htim2);

float idx = 0;
float step = 3.6;

while(1)里面​

if(flag == 1)
{
float phase = 2.0f*PI*(idx/360.0f);
uint16_t dac_val = 4095.0f*((sinf(phase)+1.0f)/2.0f);
DAC_SetDigital(dac_val);
idx += step;
flag = 0;
}